﻿using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Onetube.Entities.Enums;
using Onetube.Entities.SearchrQuery;
using Onetube.Models.SearchVideo;

namespace Onetube.Providers.Interfaces
{
    public interface IYoutubeSearchProvider
    {
        Task<SearchVideoResult> SearchTermAsync(string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<SearchQueryResult> SearchTermAsyncPrevPage(string prevPageToken, string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<SearchVideoResult> SearchTermAsyncNextPage(string nextPageToken, string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<SearchVideoResult> SearchRecommendedAsync(string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<SearchQueryResult> SearchRecommendedPrevPageAsync(string prevPageToken, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<SearchVideoResult> SearchRecommendedNextPageAsync(string nextPageToken, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<Entities.ChannelsQuery.ChannelsQueryResult> SearchChannelByTermAsync(string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<Entities.ChannelsQuery.ChannelsQueryResult> SearchChannelByTermAsyncPrevPage(string prevPageToken, string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<Entities.ChannelsQuery.ChannelsQueryResult> SearchChannelByTermAsyncNextPage(string nextPageToken, string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);
        
         Task<Models.SearchPlayListResult> SearchPlayListByTermAsync(string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<Models.SearchPlayListResult> SearchPlayListByTermAsyncPrevPage(string prevPageToken, string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);

        Task<Models.SearchPlayListResult> SearchPlayListByTermAsyncNextPage(string nextPageToken, string term, string regionCode, SearchOrder order, string maxResults, CancellationTokenSource cancelTask);
        

        Task<List<string>> GetSuggestedResultsAsync(string languageCode, string regionCode, string textToSearch, CancellationTokenSource cancelTask);
    }
}